package mSecretaria;

import java.sql.Date;
import java.sql.ResultSet;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import myUtils.Constantes;
import myUtils.EstadoCerimonia;
import myUtils.EstadoLivro;
import myUtils.IModelo;
import play.db.DB;
import play.db.jpa.Model;

public class MCerimonia extends Model implements IModelo {

	private int codCerimonia;
	private MCelebrante celebrante;
	private int codTipoCelebracao;
	private MIgreja igreja;
	private int codTipoCerimonia;
	private int qtdSacramentos;
	private Date dataCadastro;
	private String loginUsuarioCadastro;
	private EstadoCerimonia estado;
	private String descricao;
	private Date dataCerimonia;
	
	SimpleDateFormat formataData = new SimpleDateFormat("dd/MM/yyyy");
	
	public int getCodCerimonia()
	{
		return this.codCerimonia;
	}
	
	public int getCodCelebrante()
	{
		return this.celebrante.getCodCelebrante();
	}
	
	public String getNomeCelebrante()
	{
		return this.celebrante.getNome();
	}
	
	public void setCodCelebrante(int aCodCelebrante)
	{
		try
		{
			this.celebrante = new MCelebrante(aCodCelebrante);
		}
		catch(Exception e)
		{
			e.getMessage();
		}
	}
	
	public int getCodTipoCelebracao()
	{
		return this.codTipoCelebracao;
	}
	
	public void setCodTipoCelebracao(int aCodTipoCelebracao)
	{
		this.codTipoCelebracao = aCodTipoCelebracao;
	}
	
	public int getCodIgreja()
	{
		return this.igreja.getCodIgreja();
	}
	
	public String getNomeIgreja()
	{
		return this.igreja.getNome();
	}
	
	public void setCodIgreja(int aCodIgreja)
	{
		try
		{
			this.igreja = new MIgreja(aCodIgreja);
		}
		catch(Exception e)
		{
			e.getMessage();
		}
	}
	
	public int getCodTipoCerimonia()
	{
		return this.codTipoCerimonia;
	}
	
	public void setCodTipoCerimonia(int aCodTipoCerimonia)
	{
		this.codTipoCerimonia = aCodTipoCerimonia;
	}
	
	public int getQtdSacramentos()
	{
		return this.qtdSacramentos;
	}
	
	public void setQtdSacramentos(int aQtdSacramentos)
	{
		this.qtdSacramentos = aQtdSacramentos;
	}
	
	public Date getDataCadastro()
	{
		return this.dataCadastro;
	}
	
	public EstadoCerimonia getEstado()
	{
		return this.estado;
	}
	
	public void setEstado(EstadoCerimonia aEstado)
	{
		this.estado = aEstado;
	}
	
	public void setDescricao(String aDescricao)
	{
		this.descricao = aDescricao;
	}
	
	public String getDescricao()
	{
		return this.descricao;
	}
	
	public void setDataCerimonia(String aDataCerimonia) throws ParseException
	{
		this.dataCerimonia = new Date(formataData.parse(aDataCerimonia).getTime());
	}
	
	public String getDataCerimonia()
	{
		return new SimpleDateFormat("dd/MM/yyyy").format(this.dataCerimonia);
	}
	
	public MCerimonia(int aCodCerimonia) throws Exception
	{
		ResultSet rs;
		
		String strQuery = "Select * From Cerimonia Where Cerimonia.CodCerimonia = " + aCodCerimonia;	
		
		try
		{
			rs = DB.executeQuery(strQuery);
			
			
			if(rs == null)
				throw new Exception("Cerimonia não cadastrada!");
			
			while (rs.next())
			{
				this.codCerimonia	= rs.getInt("codCerimonia");
				setCodCelebrante(rs.getInt("codCelebrante"));
				this.codTipoCelebracao = rs.getInt("codTipoCelebracao");
				setCodIgreja(rs.getInt("codIgreja"));
				this.codTipoCerimonia = rs.getInt("codTipoCerimonia");
				this.qtdSacramentos = rs.getInt("qtdSacramentos");
				this.dataCadastro = rs.getDate("dataCadastro");
				this.dataCerimonia = rs.getDate("dataCerimonia");
				this.loginUsuarioCadastro = rs.getString("loginUsuarioCadastro");
				this.descricao = rs.getString("descricao");
				switch(rs.getInt("CodTipoCerimonia"))
				{
					case Constantes.crAberta: this.estado = EstadoCerimonia.Aberta;break;
					case Constantes.crLotada: this.estado = EstadoCerimonia.Lotada;break;
					case Constantes.crRealizada: this.estado = EstadoCerimonia.Realizada;break;
				}
			}
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage());
		}
				
	}
	
	public MCerimonia(int aCodCelebrante,int aCodTipoCelebracao,
	int aCodIgreja,int aCodTipoCerimonia,int aQtdSacramentos,
	String aLoginUsuarioCadastro,String aDescricao,String aDataCerimonia) throws ParseException
	{
		this.codCerimonia = 0;
		setCodCelebrante(aCodCelebrante);
		this.codTipoCelebracao = aCodTipoCelebracao;
		setCodIgreja(aCodIgreja);
		this.codTipoCerimonia = aCodTipoCerimonia;
		this.qtdSacramentos = aQtdSacramentos;
		this.loginUsuarioCadastro = aLoginUsuarioCadastro;
		this.descricao = aDescricao;
		this.dataCerimonia = new Date(formataData.parse(aDataCerimonia).getTime());
		
		this.estado = EstadoCerimonia.Aberta;
	}
	
	public static List<MCerimonia> select(int aCodCerimonia, String aDescricao,int aCodCelebrante, int aCodIgreja, EstadoCerimonia aEstado) throws Exception
	{
		ResultSet rs;
		int codCerimonia;
		
		
		List<MCerimonia> retorno  = new ArrayList<MCerimonia>();
		String strQuery = "Select * From Cerimonia Where Cerimonia.CodCerimonia > 0" ;

		if(aCodCerimonia > 0)
		{
			strQuery += " and Cerimonia.CodCerimonia = " + aCodCerimonia;
		}
		
		if(aCodCelebrante > 0)
		{
			strQuery += " and Cerimonia.CodCelebrante = " + aCodCelebrante;
		}
		
		if(aCodIgreja > 0)
		{
			strQuery += " and Cerimonia.CodIgreja = " + aCodIgreja;
		}
		
		switch(aEstado)
		{
			case Aberta: strQuery += " and Cerimonia.Estado = " + Constantes.crAberta; break;
			case Lotada: strQuery += " and Cerimonia.Estado = " + Constantes.crLotada; break;
			case Realizada: strQuery += " and Cerimonia.Estado = " + Constantes.crRealizada; break;
		}
		
		strQuery += " and Cerimonia.Descricao Like '" + aDescricao + "%'"; 
		
		
		try
		{
			rs = DB.executeQuery(strQuery);	
			
			while (rs.next())
			{
				codCerimonia 	= rs.getInt("CodCerimonia");
				
				MCerimonia cerimonia = new MCerimonia(codCerimonia);
				retorno.add(cerimonia);
				
			}	
			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage() + "\n Comando: " + strQuery);
		}
		
		return retorno;		
		
	}
	
	@Override
	public void update() throws Exception {
		
		if(this.codCerimonia == 0)
		{
			this.insert();
		}
		else
		{
			ResultSet rs;
			
			//atualiza objeto
			String strQuery2 = "Select * From Cerimonia Where Cerimonia.CodCerimonia = " + this.codCerimonia;
			
			String strQuery = "Update Cerimonia set Descricao = '" + this.descricao + "'";
			strQuery +=	",codcelebrante = " + this.celebrante.getCodCelebrante();
			strQuery += ",codtipocelebracao = "  + this.codTipoCelebracao;
			strQuery += ",qtdsacramentos = "  + this.qtdSacramentos;
			strQuery += ",datacerimonia = '"+ this.dataCerimonia;
			strQuery += "',loginusuariocadastro = '"+ this.loginUsuarioCadastro;
			strQuery += "',codigreja = " + this.igreja.getCodIgreja();
			strQuery += ", codtipocerimonia = "  + this.codTipoCerimonia;
			switch(this.estado)
			{
				case Aberta: strQuery += ", Estado = " + Constantes.crAberta ;break;
				case Lotada: strQuery += ", Estado = " + Constantes.crLotada ;break;
				case Realizada: strQuery += ", Estado = " + Constantes.crRealizada ;break;
			}
			
			
			strQuery += " Where Cerimonia.codCerimonia = " + this.codCerimonia;
			
			
			try
			{
				DB.execute(strQuery);
				rs = DB.executeQuery(strQuery2);
				
				while (rs.next())
				{
					this.codCerimonia	= rs.getInt("codCerimonia");
					setCodCelebrante(rs.getInt("codCelebrante"));
					this.codTipoCelebracao = rs.getInt("codTipoCelebracao");
					setCodIgreja(rs.getInt("codIgreja"));
					this.codTipoCerimonia = rs.getInt("codTipoCerimonia");
					this.qtdSacramentos = rs.getInt("qtdSacramentos");
					this.dataCadastro = rs.getDate("dataCadastro");
					this.dataCerimonia = rs.getDate("dataCerimonia");
					this.loginUsuarioCadastro = rs.getString("loginUsuarioCadastro");
					this.descricao = rs.getString("descricao");
					switch(rs.getInt("CodTipoCerimonia"))
					{
						case Constantes.crAberta: this.estado = EstadoCerimonia.Aberta;break;
						case Constantes.crLotada: this.estado = EstadoCerimonia.Lotada;break;
						case Constantes.crRealizada: this.estado = EstadoCerimonia.Realizada;break;
					}
				}			
				
			}
			catch(Exception e)
			{
				throw new Exception(e.getMessage());
			}
		}
		
	}

	@Override
	public void excluir() throws Exception {
		if(this.codCerimonia != 0)
		{
			String strQuery = "Delete From Cerimonia Where Cerimonia.CodCerimonia = " + this.codCerimonia;
			
			try
			{
				DB.execute(strQuery);	
				this.codCerimonia = 0;
			}
			catch(Exception e)
			{
				throw new Exception(e.getMessage() + "\n Comando: " + strQuery);
			}
		}
	}

	@Override
	public void insert() throws Exception {
		/*String tt = "26/11/2012";
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");   
		Date data = new Date(simpleDateFormat.parse(tt).getTime());*/
		
		String strQuery = "Insert Into Cerimonia(descricao,codcelebrante,codtipocelebracao,qtdsacramentos,datacadastro,datacerimonia,loginusuariocadastro,codigreja,codtipocerimonia,estado) Values(";
		strQuery += "'"  + this.descricao;
		strQuery +=	"'," + this.celebrante.getCodCelebrante();
		strQuery += ","  + this.codTipoCelebracao;
		strQuery += ","  + this.qtdSacramentos;
		this.dataCadastro = new java.sql.Date(new java.util.Date().getTime());
		strQuery += ",'" + this.dataCadastro;
		strQuery += "','"+ this.dataCerimonia;
		strQuery += "','"+ this.loginUsuarioCadastro;
		strQuery += "'," + this.igreja.getCodIgreja();
		strQuery += ","  + this.codTipoCerimonia;
		switch(this.estado)
		{
			case Aberta: strQuery += "," + Constantes.crAberta +")";break;
			case Lotada: strQuery += "," + Constantes.crLotada +")";break;
			case Realizada: strQuery += "," + Constantes.crRealizada +")";break;
		}
		
		try
		{
			DB.execute(strQuery);
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage() + "\n Comando: " + strQuery);
		}
	}

}
